package com.aqie.libfactory.data.helper;

import android.util.Log;

import com.aqie.libfactory.model.IMessage;
import com.aqie.libfactory.Factory;
import com.aqie.libfactory.model.card.MessageCard;
import com.aqie.libfactory.model.db.Message;
import com.aqie.libfactory.model.db.Message_Table;
import com.raizlabs.android.dbflow.sql.language.OperatorGroup;
import com.raizlabs.android.dbflow.sql.language.SQLite;

import java.util.List;

/**
 * 消息工具类
 */
public class MessageHelper {
    // 从本地找消息
    public static Message findFromLocal(String id) {
        return SQLite.select()
                .from(Message.class)
                .where(Message_Table.msgId.eq(id))
                .querySingle();
    }

    public static void push(IMessage model) {

        Factory.runOnAsync(new Runnable() {
            @Override
            public void run() {
                // todo 成功状态：如果是一个已经发送过的消息，则不能重新发送 message.getStatus() != Message.STATUS_FAILED
                // 正在发送状态：如果是一个消息正在发送，则不能重新发送
                Message message = findFromLocal(model.getMsgId());
                Log.e("MessageHelper", "push " + message);

                MessageCard card = new MessageCard();
                card.setMsg(model.getMsg());
                card.setMsgId(model.getMsgId());
                card.setReceiverId(model.getReceiverId());
                card.setSenderId(model.getSenderId());
                card.setStatus(model.getStatus());
                // 我们在发送的时候需要通知界面更新状态，Card;
                Factory.getMessageCenter().dispatch(card);
            }
        });

    }

    /**
     * 查询一个消息，这个消息是和一个人的最后一条聊天消息
     *
     * @param userId UserId
     * @return 聊天的最后一条消息
     */
    public static Message findLastWithUser(String userId) {
        return SQLite.select()
                .from(Message.class)
                .where(OperatorGroup.clause()
                        .and(Message_Table.sender_userId.eq(userId))
                        .and(Message_Table.groupId.isNull()))
                .or(Message_Table.receiver_userId.eq(userId))
                .orderBy(Message_Table.createAt, false) // 倒序查询
                .querySingle();
    }

    /**
     * 查询所有和这个session 聊天的未签收消息数量
     */
    public static Long findUnSignMessageCount(String userId) {
        return SQLite.selectCountOf()
                .from(Message.class)
                .where(OperatorGroup.clause()
                        .and(Message_Table.sender_userId.eq(userId))
                        .and(Message_Table.sign.eq(0))
                )
                .count();
    }

    /**
     * 从本地搜索消息
     * @param msg
     * @return
     */
    public static List<Message> findLocalMessage(String msg) {
            return SQLite.select()
                    .from(Message.class)
                    .where(Message_Table.msg.like("%"+msg+"%"))
                    .orderBy(Message_Table.createAt, true)
                    .limit(1000)
                    .queryList();
    }

    /**
     * 从本地查询指定接收者所有 未签收消息
     * 只查找发送人的， 不查找接收人也就是我发送的
     * @param userId
     * @return
     */
    public static List<Message> findUserUnSignMessages(String userId) {
        return SQLite.select()
                .from(Message.class)
                .where(OperatorGroup.clause()
                        .and(Message_Table.sender_userId.eq(userId))
                        .and(Message_Table.sign.eq(0)))
                //.or(Message_Table.receiver_userId.eq(userId))
                .orderBy(Message_Table.createAt, false) // 倒序查询
                .queryList();
    }



}
